from lxml import etree

'''
xpath处理xml练习
'''

xml = '''
<book>
    <id>1</id>
    <name>野花遍地香</name>
    <price>1.23</price>
    <nick>臭豆腐</nick>
    <author>
        <nick id="10086">周大强</nick>
        <nick id="10010">周芷若</nick>
        <nick class="jay">周杰伦</nick>
        <nick class="jolin">蔡依林</nick>
        <div>
            <nick>nick_div</nick>
        </div>
    </author>
    <partner>
        <nick id="ppc">胖胖陈</nick>
        <nick id="ppbc">胖胖不陈</nick>
        <span>
            <nick>nick_span</nick>
        </span>
    </partner>
</book>
'''


'''
说明：
etree.XML(xml)      得到XML的Element对象
/                   代表根节点
//                  代表后代节点
text()              获取节点标签内的文本
[]                  属性筛选，[@属性名='值']。如[@class='jay']、nick[@id="10086"]
@                   直接获属性的值。如@id、@href
'''
# 获取得到的都是Element节点对象
et = etree.XML(xml)

# 根节点
# result = et.xpath('/book')

# text()是获取节点下的文字，返回的是列表
result = et.xpath('/book/name/text()')[0]
print(result) #野花遍地香

# “//”代表获取子孙后代
result = et.xpath('/book//nick/text()')
print(result) #['臭豆腐', '周大强', '周芷若', '周杰伦', '蔡依林', '惹了', '胖胖陈', '胖胖不陈']

# 获取所有2级下的nick
result = et.xpath('/book/*/nick/text()')
print(result) #['周大强', '周芷若', '周杰伦', '蔡依林', '胖胖陈', '胖胖不陈']

# 获取所有3级下的nick
result = et.xpath('/book/*/*/nick/text()')
print(result) #['nick_div', 'nick_span']

# 获取nick,class='jay'的文本
result = et.xpath('/book/author/nick[@class="jay"]/text()')
print(result) #['周杰伦']

# 获取nick,id='10086'的文本
result = et.xpath('/book/author/nick[@id="10086"]/text()')
print(result) # ['周大强']

# 获取partner里所有的id的值
result = et.xpath('/book/partner/nick/@id')
print(result) # ['ppc', 'ppbc']